#ifndef HASHFILE_H_
#define HASHFILE_H_

#include "../common/Resultados.h"
#include "../BloqArch/ArchBloques.h"
#include "../HashUtils/HashPrinter.h"
#include "CabeceraHashing.h"
#include "BloqueHash.h"
#include "RegistroHash.h"


class HashFile {
private:
	ArchBloques _arch;
	CabeceraHashing _headerDispersion;

	// Resuelve el overflow en el bloque, el registro es el causante del overflow
	void resolverOverflow(BloqueHash &bloque, RegistroHash reg);

	// Realiza la redispersion de los registros entre los dos bloques
	void redispersarRegistros(BloqueHash& bOver, BloqueHash& bEmpty, unsigned int posBEmpty) const;

	unsigned int guardarBloque(BloqueHash& b, int pos = -1);
	void cargarBloque(BloqueHash& b, int pos);

public:
	HashFile();

	bool abrir(std::string nomArch);
	bool crear(std::string nomArch);

	// Las operaciones soprtadas
	Resultado insertarRegistro(RegistroHash reg);
	Resultado eliminarRegistro(const RegistroHash& reg);
	RegistroHash buscarRegistro(const RegistroHash& reg);

	friend class HashPrinter;
};

#endif /* HASHFILE_H_ */
